package com.briup.day13;

/**
 * @author ThinkBook
 */
public class Test05_Trans {
    public static void main(String[] args) {
        //正确的先向上转型
        //Base b = new Derived();
        Base b = new Base();

        //再向下转型
        //用父类对象 直接给 子类引用赋值，无法成功，必须使用 强制类型转换才可以
        if (b instanceof Derived){
            Derived d = (Derived)b;

            //调用方法
            d.show();
        }else {
            System.out.println("b 指向内存 不是 Derived对象");
        }

    }
    public static void main02(String[] args) {
        //Base b = new Base();   编译可以成功但是运行会出错

        //正确的先向上转型
        Base b = new Derived();

        //再向下转型
        //用父类对象 直接给 子类引用赋值，无法成功，必须使用 强制类型转换才可以
        Derived d = (Derived)b;

        //调用方法
        d.show();
    }
    /*
     * 多态(向上转型)访问特点:
     * 	      成员变量: 编译看左边 (父类), 运行看左边 (父类)
     * 	      成员方法: 编译看左边 (父类), 运行看右边 (子类)
     */
    public static void main01(String[] args) {
        //1.向上转型：用子对象 给 父类引用赋值
        Base b = new Derived();

        //2.访问成员变量: 编译看左边 (父类), 运行看左边 (父类)
        System.out.println(b.n);		//Base: n
        //父类中没有v这个成员，编译失败
        //System.out.println(b.v);  	//error

        //3.方法成员方法: 编译看左边 (父类), 运行看右边 (子类)
        //调用的是子类重写以后的方法
        b.show();
        //父类中没有disp()方法，编译失败
        //b.disp();						//error
    }

}
class Base{
    int n = 1;
    public void show() {
        System.out.println("in Base, n: " + n);
    }
}
class Derived extends Base {
    //新增成员
    int n = 2; //同名成员
    int v = 20;
    //重写方法
    public void show() {
        System.out.println("in Derived, n: " + n); //this.n >super.n
        System.out.println("in Derived, v: " + v);
    }
    //新增方法
    public void disp() {
        System.out.println("in Derived, v: " + v);
    }
}
